import re

_PHONE_PATTERN_CHINA_MOBILE = re.compile(r'^(134|13[5-9]|147|15[0-27-9]|165|170|172|178|18[2-478]|19[578])[0-9]{8}$')
_PHONE_PATTERN_CHINA_UNICOM = re.compile(r'^(13[0-2]|145|15[56]|16[67]|170|17[156]|18[56]|196)[0-9]{8}$')
_PHONE_PATTERN_CHINA_TELECOM = re.compile(r'^(133|149|153|162|170|17[37]]|18[019]|19[0139])[0-9]{8}$')
_PHONE_PATTERN_CHINA = re.compile(r'^(13[0-9]|14[579]|15[0-35-9]|16[2567]|17[01235-8]|18[0-9]|19[0-9])[0-9]{8}$')


def is_valid_phone(phone):
    """
    检查是否合法的中国内地手机号，返回 True/False
    """
    try:
        valid = bool(_PHONE_PATTERN_CHINA.match(phone))
        if not valid:
            return is_fake_phone(phone)
        return valid
    except TypeError:
        # 当 phone 不是字符串时，会抛出 TypeError
        return False


_FAKE_PHONE_PATTERN = re.compile(r'^100[0-9]{8}$')


def is_fake_phone(phone):
    """
    在我们的体系中，我们使用 100 开头的号码作为假手机号。
    """
    try:
        return bool(_FAKE_PHONE_PATTERN.match(phone))
    except TypeError:
        return False